/**
 * 节流: n 秒内只运行一次，若在 n 秒内重复触发，只有一次生效
 * 完成节流可以使用时间戳与定时器的写法
 * */
// 使用时间戳写法，事件会立即执行，停止触发后没有办法再次执行

function Throttle1(fn, delay = 500) {
    let oldTime = null
    return function (...args) {
        let newTime = Date.now()
        if (oldTime == null || newTime - oldTime >= delay) {
            fn.apply(...args)
            oldTime = Date.now()
        }
    }
}

// 可以将时间戳写法的特性与定时器写法的特性相结合，实现一个更加精确的节流。实现如下

function throttled(fn, delay) {
    let timer = null
    let startTime = Date.now()
    return function () {
        let curTime = Date.now() // 当前时间
        let remaining = delay - (curTime - startTime)  // 从上一次到现在，还剩下多少多余时间
        let context = this
        let args = arguments
        clearTimeout(timer)
        if (remaining <= 0) {
            fn.apply(context, args)
            startTime = Date.now()
        } else {
            timer = setTimeout(fn, remaining);
        }
    }
}
